package com.ruoyi.book.service.impl;

import com.alibaba.fastjson2.JSONObject;
import com.ruoyi.book.domain.BookInstitutionInfo;
import com.ruoyi.book.domain.HuiWenApiUrl;
import com.ruoyi.book.mapper.BookInstitutionInfoMapper;
import com.ruoyi.book.service.HttpApiService;
import com.ruoyi.common.utils.http.HttpUtils;
import org.springframework.beans.factory.annotation.Autowired;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.springframework.stereotype.Service;

/**
 * @Author Huang dun
 * @Description //TODO
 * @Date 2025/3/31 15:11
 **/
@Service
public class HttpApiServiceImpl implements HttpApiService {

    private final HuiWenApiUrl huiWenApiUrl;
    @Autowired
    public HttpApiServiceImpl(HuiWenApiUrl huiWenApiUrl) {
        this.huiWenApiUrl = huiWenApiUrl;
    }

    @Autowired(required=false)
    private BookInstitutionInfoMapper bookInstitutionInfoMapper;

    /**
     * 调用 huiwen API 获取读者基本信息
     *
     * @param id 读者id （userId）
     * @return 结果
     */
    @Override
    public JSONObject getUserInfoById(String institutionId, String id, String type) {
        // 设置请求参数
        JSONObject params=new JSONObject();
        // 设置查询参数
        params.put("id",id);
        params.put("type",type);
        // 调用通用方法获取目标URL和认证信息，传入具体的路径
        Map<String, String> apiCallContext = prepareApiCallContext(institutionId, huiWenApiUrl.getPatronInfoPath());
        // 调用API并返回结果
        return HttpUtils.callAPI(apiCallContext.get("targetURL"), params, apiCallContext.get("apiAuth"), null);
    }

    /**
     * 调用 huiwen API 校验读者登录信息
     *
     * @param id 读者id （userId）
     * @param pw 读者密码
     * @param type 读者身份类型
     * @return 结果
     */
    @Override
    public JSONObject validUserInfo(String institutionId,String id, String pw, String type) {
        // 设置请求参数
        JSONObject params=new JSONObject();
        params.put("id",id);
        params.put("pw",pw);
        params.put("type",type);
        // 调用通用方法获取目标URL和认证信息，传入具体的路径
        Map<String, String> apiCallContext = prepareApiCallContext(institutionId, huiWenApiUrl.getPatronValidPath());
        // 调用API并返回结果
        return HttpUtils.callAPI(apiCallContext.get("targetURL"), params, apiCallContext.get("apiAuth"), null);
    }

    /**
     * 调用 huiwen API 获取读者委托请求（读者委托申请和委托划到信息查询）
     *
     * @param id 读者id （userId）
     * @param type 读者身份类型
     * @return 结果
     */
    @Override
    public JSONObject commissionRequest(String institutionId,String id, String type) {
        // 设置请求参数
        JSONObject params=new JSONObject();
        params.put("id",id);
        params.put("type",type);
        // 调用通用方法获取目标URL和认证信息，传入具体的路径
        Map<String, String> apiCallContext = prepareApiCallContext(institutionId, huiWenApiUrl.getPatronCommissionRequestPath());
        // 调用API并返回结果
        return HttpUtils.callAPI(apiCallContext.get("targetURL"), params, apiCallContext.get("apiAuth"), null);
    }

    /**
     * 调用汇文API 获取取图书封面
     *
     * @param bibIdList 书籍id列表
     * @param isbnList 书籍ISBN列表
     * @return 结果
     */
    @Override
    public JSONObject getBookCover(String institutionId, List<String> bibIdList, List<String> isbnList) {
        // 设置请求参数
        JSONObject params=new JSONObject();
        params.put("bibIds", bibIdList);
        params.put("isbns", isbnList);
        // 调用通用方法获取目标URL和认证信息，传入具体的路径
        Map<String, String> apiCallContext = prepareApiCallContext(institutionId, huiWenApiUrl.getGetBookCoverPath());
        // 调用API并返回结果
        return HttpUtils.callAPI(apiCallContext.get("targetURL"), params, apiCallContext.get("apiAuth"), "application/json;charset=utf-8");
    }

    /**
     * 通用方法：根据机构ID和指定的路径准备接口调用所需的上下文信息
     *
     * @param institutionId 机构ID
     * @param path          动态路径（如 huiWenApiUrl.getPatronInfoPath() 或 huiWenApiUrl.getA()）
     * @return 包含目标URL和认证信息的Map对象
     */
    private Map<String, String> prepareApiCallContext(String institutionId, String path) {
        // 根据机构ID获取相关信息
        BookInstitutionInfo bookInstitutionInfo = bookInstitutionInfoMapper.selectBookInstitutionInfoByInstitutionId(Long.valueOf(institutionId));
        System.out.println("bookInstitutionInfo:" + bookInstitutionInfo);
        // 目标API地址
        String targetURL = bookInstitutionInfo.getHostUrl() + path;
        System.out.println("targetURL:" + targetURL);
        // 构建接口调用需要的认证信息
        String apiAuth = HttpUtils.buildApiAuthHeader(bookInstitutionInfo.getAppId(), bookInstitutionInfo.getAppKey());
        // 使用Map封装返回值
        Map<String, String> context = new HashMap<>();
        context.put("targetURL", targetURL);
        context.put("apiAuth", apiAuth);
        return context;
    }
}
